﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
using AccesoBD;
using System.Data;

namespace AccesoBD
{
    public class Afiliaciones
    {
        int idAfiliado;

        public Boolean verificarAfiliado(int tipoDoc, long nroDoc)
        {
            Boolean res = false; ;
            SqlConnection conexion = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT Persona.tipoDocumento, Persona.nroDocumento, Paciente.tieneAfiliacion FROM Persona INNER JOIN Paciente ON Persona.codPersona = Paciente.idPersona WHERE (Persona.tipoDocumento = @tipoDoc) AND (Persona.nroDocumento = @nroDoc) AND (Paciente.tieneAfiliacion = 1)", conexion);
            sql.Parameters.Add(new SqlParameter("@nroDoc", nroDoc));
            sql.Parameters.Add(new SqlParameter("@tipoDoc", tipoDoc));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                if (dr["nroDocumento"] != null)
                {
                    res = true;
                }
            }


            return res;

        }

        public Boolean registrarAfiliado(DateTime fechaAlta, long nroHC, long idPers)
        {
            bool res;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;

            try
            {
                trans = conexion.BeginTransaction();

                //inserto historial de ingreso
                HistorialesDeIngreso his = new HistorialesDeIngreso();
                his.registrarAltaHistoriaDeIngreso(fechaAlta);

                //obtener idHistorialIngreso
                string comando = " SELECT MAX(idHistorialIngreso) FROM Historial_Ingreso";
                List<SqlParameter> lista = new List<SqlParameter>();
                int idHistorial = int.Parse(DB.EjecutarScalar(comando, lista, conexion, trans));


                //crear Afiliado   
                string comando3 = "INSERT INTO Afiliado (idHistorialIngreso, nroHCpaciente, idPersonaPaciente) VALUES (@idHistorial,@nroHC,@idPersona)";
                List<SqlParameter> listaParam3 = new List<SqlParameter>();

                listaParam3.Add(new SqlParameter("@idHistorial", idHistorial));
                listaParam3.Add(new SqlParameter("@nroHC", nroHC));
                listaParam3.Add(new SqlParameter("@idPersona", idPers));
                DB.EjecutarCommand(comando3, listaParam3, conexion, trans);

                //obtener idAfiliado
                string comando4 = "SELECT MAX(nroAfiliado) FROM Afiliado";
                listaParam3 = new List<SqlParameter>();
                idAfiliado = int.Parse(DB.EjecutarScalar(comando4, listaParam3, conexion, trans));

                //actualizar Tabla Paciente indicando que ya es un afiliado (Barby)
                string comando5 = "UPDATE Paciente SET nroAfiliado = @nroAfiliado, tieneAfiliacion = @tieneAf WHERE (nroHC = @nroHC) AND (idPersona = @idPersona)";
                SqlCommand sqlcmd = new SqlCommand(comando5, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroAfiliado", idAfiliado));
                sqlcmd.Parameters.Add(new SqlParameter("@tieneAf", true));
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                sqlcmd.Parameters.Add(new SqlParameter("@idPersona", idPers));
                sqlcmd.Transaction = trans;
                sqlcmd.ExecuteNonQuery();

                trans.Commit();
                res = true;
                return res;
            }

            catch (Exception)
            {
                if (trans != null)
                    trans.Rollback();
                res = false;
                throw;
            }
            finally
            {
                if (conexion != null && conexion.State == ConnectionState.Open)
                    conexion.Close();
            }

        }

        public float precioCuota(int idPlan)
        {
            float precioCuota = 0;


            SqlConnection conexion = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT precioCuota FROM Plan_Afiliacion WHERE idPlan = @idPLan", conexion);
            sql.Parameters.Add(new SqlParameter("@idPlan", idPlan));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                if (dr["precioCuota"] != null)
                {
                    precioCuota = float.Parse(dr["precioCuota"].ToString());
                }
            }

            return precioCuota;
        }

        public bool registrarCuota(int nroAfiliado, int idPlan)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();

            

            string comando = "INSERT INTO Cuota_Afiliado(mes, año, nroAfiliado, fechaVencimiento, importe) VALUES (@mes,@año,@nroAfiliado,@fechaVencimiento, @importe)";
            List<SqlParameter> listaParam5 = new List<SqlParameter>();
            listaParam5.Add(new SqlParameter("@mes", DateTime.Now.Month));
            listaParam5.Add(new SqlParameter("@año", DateTime.Now.Year));
            listaParam5.Add(new SqlParameter("@nroAfiliado", nroAfiliado));
            DateTime fechaVencimiento = DateTime.Now.AddMonths(1);
            listaParam5.Add(new SqlParameter("@fechaVencimiento", fechaVencimiento));
            float precioCuota = this.precioCuota(idPlan);
            listaParam5.Add(new SqlParameter("@importe", precioCuota));
            int filas = DB.EjecutarCommand(comando, listaParam5, conexion);
            if (filas > 0) res = true;
            else res = false;
            conexion.Close();


            return res;
        }

        public bool registrarAfiliacionTitular(int plan, bool adhe, bool ecco, DateTime fechaAlta, long nroHC, long idPers)
        {
            bool res;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;

            try
            {
                trans = conexion.BeginTransaction();

                this.registrarAfiliado(fechaAlta, nroHC, idPers);

                string comando = "INSERT INTO Afiliacion(nroAfiliado, idPlan, esAdherente, ecco) VALUES (@nroAf,@idPlan,@adhe,@ecco)";
                List<SqlParameter> listaParam5 = new List<SqlParameter>();

                listaParam5.Add(new SqlParameter("@nroAf", idAfiliado));
                listaParam5.Add(new SqlParameter("@idPlan", plan));
                listaParam5.Add(new SqlParameter("@adhe", adhe));
                listaParam5.Add(new SqlParameter("@ecco", ecco));
                int filas = DB.EjecutarCommand(comando, listaParam5, conexion, trans);

                //insertar cuota_afiliado

                string comando2 = "INSERT INTO Cuota_Afiliado(mes, año, nroAfiliado, fechaVencimiento, importe) VALUES (@mes,@año,@nroAfiliado,@fechaVencimiento, @importe)";
                SqlCommand sqlcmd = new SqlCommand(comando2, conexion);
                List<SqlParameter> listaParam = new List<SqlParameter>();
                sqlcmd.Parameters.Add(new SqlParameter("@mes", DateTime.Now.Month));
                sqlcmd.Parameters.Add(new SqlParameter("@año", DateTime.Now.Year));
                sqlcmd.Parameters.Add(new SqlParameter("@nroAfiliado", idAfiliado));
                DateTime fechaVencimiento = DateTime.Now.AddMonths(1);
                sqlcmd.Parameters.Add(new SqlParameter("@fechaVencimiento", fechaVencimiento));
                float precioCuota = this.precioCuota(plan);
                sqlcmd.Parameters.Add(new SqlParameter("@importe", precioCuota));
                sqlcmd.Transaction = trans;
                filas = sqlcmd.ExecuteNonQuery();

                trans.Commit();

                if (filas > 0) res = true;
                else res = false;
                conexion.Close();

                return res;
            }

            catch (Exception)
            {
                if (trans != null)
                    trans.Rollback();
                res = false;
                throw;
            }
            finally
            {
                if (conexion != null && conexion.State == ConnectionState.Open)
                    conexion.Close();
            }

        }

        public bool registrarAfiliacionAdherente(int plan, bool adhe, long titular, bool ecco, DateTime fechaAlta, long nroHC, long idPers)
        {
            bool res;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;

            try
            {
                trans = conexion.BeginTransaction();

                this.registrarAfiliado(fechaAlta, nroHC, idPers);

                string comando = "INSERT INTO Afiliacion(nroAfiliado, idPlan, esAdherente, ecco, nroAfiliadoTitular) VALUES (@nroAf,@idPlan,@adhe,@ecco,@titular)";
                List<SqlParameter> listaParam5 = new List<SqlParameter>();

                listaParam5.Add(new SqlParameter("@nroAf", idAfiliado));
                listaParam5.Add(new SqlParameter("@idPlan", plan));
                listaParam5.Add(new SqlParameter("@adhe", adhe));
                listaParam5.Add(new SqlParameter("@titular", titular));
                listaParam5.Add(new SqlParameter("@ecco", ecco));
                int filas = DB.EjecutarCommand(comando, listaParam5, conexion, trans);

                //insertar cuota_afiliado adherente

                string comando2 = "UPDATE Cuota_Afiliado SET importe = @imp WHERE nroAfiliado= @nroAf";
                SqlCommand sqlcmd = new SqlCommand(comando2, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroAf", titular));
                float precioCuota = this.precioCuota(plan);
                float totalAfiliado = this.obtenerPrecioCuota(titular);
                float total = precioCuota + totalAfiliado;
                sqlcmd.Parameters.Add(new SqlParameter("@imp", total));
                sqlcmd.Transaction = trans;
                filas = sqlcmd.ExecuteNonQuery();

                trans.Commit();

                if (filas > 0) res = true;
                else res = false;
                conexion.Close();

                return res;
            }

            catch (Exception)
            {
                if (trans != null)
                    trans.Rollback();
                res = false;
                throw;
            }
            finally
            {
                if (conexion != null && conexion.State == ConnectionState.Open)
                    conexion.Close();
            }



        }

        public int nroAfiliacion(int tipoDoc, long nroDoc)
        {
            int nroAfiliado = 0;
            SqlConnection conexion = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT Persona.tipoDocumento, Persona.nroDocumento, Paciente.* FROM Persona INNER JOIN Paciente ON Persona.codPersona = Paciente.idPersona WHERE (Persona.tipoDocumento = @tipoDoc) AND (Persona.nroDocumento = @nroDoc) AND (Paciente.tieneAfiliacion = 1)", conexion);
            sql.Parameters.Add(new SqlParameter("@nroDoc", nroDoc));
            sql.Parameters.Add(new SqlParameter("@tipoDoc", tipoDoc));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                if (dr["nroDocumento"] != null)
                {
                    nroAfiliado = Convert.ToInt32(dr["nroAfiliado"]);
                }
            }


            return nroAfiliado;

        }

        public float obtenerPrecioCuota(long nroAf)
        {
            float precio1 = 0;

            SqlConnection conexion = DB.Conectar();
            SqlCommand sql = new SqlCommand(" SELECT importe FROM Cuota_Afiliado WHERE nroAfiliado= @nroAf", conexion);
            sql.Parameters.Add(new SqlParameter("@nroAf", nroAf ));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                if (dr["importe"] != null)
                {
                    precio1 = float.Parse(dr["importe"].ToString());
                }
            }


            return precio1;
        
        
        }
    }

}



